using DiLu.Expansion.DataStorage.Common.Columns;
using SqlSugar;

namespace DiLu.Expansion.DataStorage.Common.BaseModels;

/// <summary>
///     表示一个默认的数据模型，该模型通过实现多个接口提供对创建者、创建时间、最后修改者、最后修改时间以及删除状态的支持。
///     该类是一个泛型基类，适用于需要审计跟踪功能的实体模型。
///     泛型参数TAccountId用于定义创建者和最后修改者ID的数据类型，支持灵活选择适合业务需求的类型。
///     泛型参数TDelete用于定义删除状态的数据类型，以适应不同的业务逻辑。
///     泛型参数TModel用于支持链式方法调用，允许在设置属性时返回当前实例的特定类型。
/// </summary>
/// <typeparam name="TAccountId">指定创建者ID和最后修改者ID的数据类型。</typeparam>
/// <typeparam name="TDelete">指定删除状态的数据类型。</typeparam>
/// <typeparam name="TModel">指定当前模型的类型，用于支持链式方法调用。</typeparam>
public class DefaultModel<TAccountId, TDelete, TModel> : IHasCreatorId<TAccountId>, IHasCreationTime,
    IHasLastModifierId<TAccountId>, IHasLastModificationTime,
    IHasIsDelete<TDelete>
{
    /// <summary>
    ///     获取或设置实体的创建时间。此属性用于记录数据条目最初被创建的时间，在插入新记录时设定，且在更新操作中保持不变。
    /// </summary>
    /// <remarks>此字段在数据插入时由系统自动填充，通常对应于记录插入数据库时的时间戳。</remarks>
    [SplitField]
    [SugarColumn(ColumnDescription = "创建时间", IsOnlyIgnoreUpdate = true)]
    public DateTime CreationTime { get; set; } = DateTime.Now;

    /// <summary>
    ///     获取或设置实体的创建者ID。此属性用于标识最初创建该数据条目的用户，通常在插入新记录时设定，并在后续操作中保持不变。
    /// </summary>
    /// <remarks>此字段的值通常由系统在数据插入时自动填充，用于关联到创建者的身份标识。</remarks>
    [SugarColumn(ColumnDescription = "创建者ID", IsOnlyIgnoreUpdate = true)]
    public TAccountId CreatorId { get; set; }

    /// <summary>
    ///     获取或设置实体的删除状态。此属性用于标记数据条目是否已被逻辑删除，通常用于实现软删除功能。
    /// </summary>
    /// <remarks>此字段的值通常由系统在删除操作时更新，用于标识数据条目是否仍然有效。</remarks>
    [SugarColumn(ColumnDescription = "是否删除")]
    public TDelete IsDelete { get; set; }

    /// <summary>
    ///     获取或设置实体的最后修改时间。此属性用于记录该数据条目最近一次被修改的时间戳，通常在更新操作时自动更新。
    /// </summary>
    /// <remarks>此字段在数据更新时由系统自动填充，用于追踪数据的最后修改时刻。</remarks>
    [SugarColumn(ColumnDescription = "最后修改时间")]
    public DateTime LastModificationTime { get; set; } = DateTime.Now;

    /// <summary>
    ///     获取或设置实体的最后修改者ID。此属性用于记录最近一次修改该数据条目的用户的标识符，在更新记录时设定。
    /// </summary>
    /// <remarks>此字段在数据更新时由系统自动填充，通常对应于当前登录用户的身份ID。</remarks>
    [SugarColumn(ColumnDescription = "最后修改者ID")]
    public TAccountId LastModifierId { get; set; }

    /// <summary>
    ///     设置创建者ID，并返回当前模型实例以支持链式调用。
    /// </summary>
    /// <param name="id">表示创建者的唯一标识符，数据类型由泛型参数TAccountId定义。</param>
    /// <returns>返回当前模型实例，类型为TModel，以便支持链式调用。</returns>
    public TModel SetCreatorId(TAccountId id)
    {
        CreatorId = id;
        return (TModel)(object)this;
    }

    /// <summary>
    ///     设置最后修改者ID，并返回当前模型实例以支持链式调用。
    /// </summary>
    /// <param name="id">表示最后修改者的唯一标识符，数据类型由泛型参数TAccountId定义。</param>
    /// <returns>返回当前模型实例，类型为TModel，以便支持链式调用。</returns>
    public TModel SetLastModifierId(TAccountId id)
    {
        LastModifierId = id;
        return (TModel)(object)this;
    }

    /// <summary>
    ///     设置删除状态，并返回当前模型实例以支持链式调用。
    /// </summary>
    /// <param name="delete">表示删除状态的值，数据类型由泛型参数TDelete定义。</param>
    /// <returns>返回当前模型实例，类型为TModel，以便支持链式调用。</returns>
    public TModel SetDelete(TDelete delete)
    {
        IsDelete = delete;
        return (TModel)(object)this;
    }
}